package leetcode.string;

/**
 * 给你两个二进制字符串，返回它们的和（用二进制表示）。
 *
 * 输入为 非空 字符串且只包含数字 1 和 0。
 * 示例 1:
 *
 * 输入: a = "11", b = "1"
 * 输出: "100"
 * 示例 2:
 *
 * 输入: a = "1010", b = "1011"
 * 输出: "10101"
 */
public class Binary {

    public static String addBinary(String a, String b) {
        /**
         *  题解1：
         *  先将二进制转十进制计算，再将计算结果转为二进制
         *  如果字符串超过 33 位，不能转化为 Integer
         *  如果字符串超过 65 位，不能转化为 Long
         *  如果字符串超过 500000001 位，不能转化为 BigInteger
         *
         *  Long result = Long.parseLong(a,2) + Long.parseLong(b,2);
         *  String resultString = Long.toBinaryString(result);
         */

        /**
         *  题解2：
         *  先将字符串反序，短位补齐，再每位相加
         */
        StringBuilder num1 = new StringBuilder(a).reverse();
        StringBuilder num2 = new StringBuilder(b).reverse();
        int num3 = Math.max(num1.length(),num2.length()) - Math.min(num1.length(),num2.length());
        if (num1.length() > num2.length()){
            for (int index = 0;index < num3 ;index++){
                num2.append("0");
            }
        }else if(num1.length() < num2.length()){
            for (int index = 0;index < num3 ;index++){
                num1.append("0");
            }
        }
        StringBuilder resultString = new StringBuilder();
        int temp = 0;
        for (int index = 0;index < num1.length();index++){
            temp = Integer.valueOf(String.valueOf(num1.charAt(index))) + Integer.valueOf(String.valueOf(num2.charAt(index))) + temp;
            switch (temp){
                case 0:
                    resultString.append(0);
                    temp = 0;
                    break;
                case 2:
                    resultString.append(0);
                    temp = 1;
                    break;
                case 1:
                    resultString.append(1);
                    temp = 0;
                    break;
                case 3:
                    resultString.append(1);
                    temp = 1;
                    break;
            }
        }
        if (temp == 1)
            resultString.append(1);
        resultString = resultString.reverse();
        return resultString.toString();
    }

}
